home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-05-01 | 12.2 KB | 478 lines | [TEXT/MPS ] |
- // UClipboard.cp
- // Copyright © 1984-1991 by Apple Computer Inc. All rights reserved.
-
- #ifndef __UCLIPBOARDMGR__
- #include <UClipboardMgr.h>
- #endif
-
- #ifndef __STDIO__
- #include <StdIo.h>
- #endif
-
- #ifndef __UWINDOW__
- #include <UWindow.h>
- #endif
-
- #ifndef __UAPPLICATION__
- #include <UApplication.h>
- #endif
-
- #ifndef __UMACAPPUTILITIES__
- #include <UMacAppUtilities.h>
- #endif
-
- #ifndef __UMACAPPGLOBALS__
- #include <UMacAppGlobals.h>
- #endif
-
- #ifndef __UMEMORY__
- #include <UMemory.h>
- #endif
-
- #ifndef __UMENUMGR__
- #include <UMenuMgr.h>
- #endif
-
- #ifndef __UERRORMGR__
- #include <UErrorMgr.h>
- #endif
-
- #ifndef __UDESKSCRAPVIEW__
- #include <UDeskScrapView.h>
- #endif
-
- #ifndef __UVIEWSERVER__
- #include <UViewServer.h>
- #endif
-
- TClipboardMgr* gClipboardMgr = NULL; // declared in interface
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAInit
-
- pascal void TClipboardMgr::Initialize(void) // Override
- {
- inherited::Initialize();
-
- fClipUndoView = NULL;
- fClipView = NULL;
- fClipWindow = NULL;
- fClipOrphanage = NULL;
- fGotClipType = FALSE;
- // ###SRF gVarClipPicSize = FALSE; // temporary
-
- fOldScrapStuff.scrapSize = 0;
- fOldScrapStuff.scrapHandle = NULL;
- fOldScrapStuff.scrapCount = 0;
- fOldScrapStuff.scrapState = 0;
- fOldScrapStuff.scrapName = NULL;
-
- fNewScrapStuff = fOldScrapStuff;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAInit
-
- pascal void TClipboardMgr::IClipboardMgr(void)
- {
- this->IEvtHandler(NULL);
-
- this->AbsorbScrapStuff(); // get the initial state of the desk scrap
- gClipboardMgr = this;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClipboard
-
- pascal void TClipboardMgr::AbandonUndoClipboard(void)
- {
- if (fClipUndoView)
- {
- #if qDebug
- if (fClipUndoView == fClipView)
- ProgramBreak("About to Free view both in clip and undo Clip!");
- #endif
- fClipUndoView->FreeFromClipboard();
- fClipUndoView = NULL;
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAActivate
-
- pascal void TClipboardMgr::AboutToLoseControl(Boolean convertClipboard) //??? Needs rework.
- {
- long err;
- FailInfo fi;
- TCommand * lastCommand;
-
- if (convertClipboard)
- {
- lastCommand = this->GetLastCommand();
- if ((lastCommand != NULL) && (lastCommand->fChangesClipboard))
- this->CommitLastCommand();
-
- if ((fClipView != NULL) && (!fClipWrittenToDeskScrap))
- {
- err = ZeroScrap();
- if (fi.Try())
- {
- fClipView->WriteToDeskScrap();
- fi.Success();
- }
- else // Recover
- {
- #if qDebugMsg
- fprintf(stderr,"Can't use clipboard data outside this app");
- #endif
- if (fi.message == 0)
- fi.message = msgExportClipFailed;
- gApplication->ShowError(fi.error, fi.message);
- }
- fClipWrittenToDeskScrap = TRUE;
- this->AbsorbScrapStuff(); // ??? correct post-error reentry point?
- }
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- pascal void TClipboardMgr::AbsorbScrapStuff(void)
- {
- fOldScrapStuff = fNewScrapStuff; // stash previous version, for later change-checkage
- fNewScrapStuff = *(InfoScrap()); // Copy over from low memory to our private
- // global record
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- pascal void TClipboardMgr::CheckDeskScrap(void)
- {
- OSErr err;
- TCommand * lastCommand;
-
- this->AbsorbScrapStuff();
-
- if (fOldScrapStuff.scrapCount != fNewScrapStuff.scrapCount)
- {
- lastCommand = this->GetLastCommand();
- if ((lastCommand != NULL) && (lastCommand->fChangesClipboard))
- this->CommitLastCommand();
- fClipView->FreeFromClipboard(); // AbandonCurrentClipboard
- fClipView = NULL; // no reason to have an Undo clipboard
-
- // If the scrap is in memory and we are low on memory, then write the scrap to disk.
- if ((fNewScrapStuff.scrapState > 0) && MemSpaceIsLow())
- err = (OSErr)UnloadScrap(); // Write the scrap to disk. How should we
- // handle the error???
- this->ReadFromDeskScrap();
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClipboard
-
- pascal void TClipboardMgr::ClaimClipboard(TView* clipView)
- {
- this->AbandonUndoClipboard(); // free up any old UNDO stuff
- fClipUndoView = fClipView; // Copy current clipboard contents to the Undo side
- if (clipView)
- this->SetClipView(clipView); // Will install it as fClipView
- else
- {
- #if qDebug
- ProgramBreak("Claiming clipboard with null view");
- #endif
- }
- fClipClaimed = TRUE;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClipboard
-
- pascal long TClipboardMgr::GetDataToPaste(Handle aDataHandle,
- ResType& dataType)
- {
- OSErr err;
-
- if (fGotClipType)
- {
- dataType = fPrefClipType;
- err = (OSErr)fClipView->GivePasteData(aDataHandle, dataType);
- if (err < 0)
- Failure(err, 0);
- }
- else
- {
- #if qDebug
- ProgramBreak("GetDataToPaste called when fGotClipType was FALSE");
- #endif
- }
- return err;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAInit
-
- pascal void TClipboardMgr::Launch(void)
- {
- // Create the clip window and default view
- fClipWindow = this->MakeClipboardWindow();
- fClipOrphanage = fClipWindow->FindSubView(kIDClipView);
- FailNILResource((Handle)fClipOrphanage);
-
- // Get the clipboard manager in the eventhandler chain after the application
- gApplication->AddHandler(this);
-
- this->AbsorbScrapStuff();
- this->ReadFromDeskScrap();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAInit
-
- pascal TWindow* TClipboardMgr::MakeClipboardWindow(void)
- {
- TWindow * aWindow;
-
- if (qTemplateViews)
- aWindow = gViewServer->NewTemplateWindow(kIDClipWindow, NULL);
- else
- {
- TDeskScrapView * aDeskScrapView;
-
- aDeskScrapView = new TDeskScrapView;
- aDeskScrapView->IDeskScrapView();
- aDeskScrapView->fIdentifier = KIDClipView;
- aWindow = gViewServer->NewSimpleWindow(kIDClipWindow, TRUE, TRUE, NULL, aDeskScrapView);
- }
-
- if (aWindow)
- {
- aWindow->fHideOnSuspend = TRUE;
- aWindow->fHandlesCursor = FALSE;
- aWindow->fLetsSubViewsHandleCursor = FALSE;
- }
- return aWindow;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClipboard
-
- pascal void TClipboardMgr::ReadFromDeskScrap(void)
- {
- TView * aViewForClipboard;
- FailInfo fi;
-
- if (fi.Try())
- {
- aViewForClipboard = this->MakeViewForAlienClipboard();
- fi.Success();
- }
- else // Recover
- {
- aViewForClipboard = fClipOrphanage;
- if (fi.message == 0)
- fi.message = msgImportClipFailed;
- gApplication->ShowError(fi.error, fi.message);
- }
-
- this->ClaimClipboard(aViewForClipboard);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClipboard
-
- pascal TView* TClipboardMgr::MakeViewForAlienClipboard(void)
- {
- TView * aView;
-
- aView = gApplication->MakeViewForAlienClipboard();
- if (!aView)
- aView = fClipOrphanage;
-
- FailNIL((Ptr)aView);
- return aView;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- pascal void TClipboardMgr::RegainControl(Boolean checkClipboard)
- {
- if (checkClipboard)
- this->CheckDeskScrap();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClipboard
-
- pascal void TClipboardMgr::SetClipView(TView* clipView)
- {
- if (fClipWindow)
- {
- TView * theSuperView;
-
- if (fClipWindow->CountSubViews() > 0)
- theSuperView = (TView *)(fClipWindow->fSubViews->First());
- else
- theSuperView = fClipWindow;
-
- CSubViewIterator iter(theSuperView);
-
- for (TView* theSubView = iter.FirstSubView(); iter.More(); theSubView = iter.NextSubView())
- theSuperView->RemoveSubView(theSubView);
-
- theSuperView->AddSubView(clipView);
- clipView->fSuperView = theSuperView;
- clipView->SuperViewChangedSize(gZeroVPt, kDontInvalidate);
- clipView->RevealTop(kDontRedraw);
- fClipWindow->ForceRedraw();
- fClipWindow->SetTarget(fClipWindow);
- fClipWrittenToDeskScrap = clipView == fClipOrphanage;
- }
- else
- {
- #if qDebug
- ProgramBreak("SetClipView in absence of fClipWindow");
- #endif
- }
-
- clipView->SetEnable(FALSE); // Ignore clicks while in clipboard views
- fClipView = clipView;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClipboard
-
- pascal void TClipboardMgr::SwapClipViews(void)
- {
- TView * tempClipView;
-
- tempClipView = fClipUndoView;
- fClipUndoView = fClipView;
-
- if (tempClipView)
- this->SetClipView(tempClipView); // Installs old Undo clipboard as current clipboard
- #if qDebug
- else
- ProgramBreak("SwapClipViews finds undo clipboard was NULL");
- #endif
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- pascal void TClipboardMgr::DoSetupMenus(void)
- {
- fGotClipType = FALSE;
- inherited::DoSetupMenus();
-
- Enable(cShowClipboard, TRUE);
-
- SetMenuState(cShowClipboard, kIDBuzzString, bzShowClip, bzHideClip, fClipWindow == gApplication->GetActiveWindow());
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- pascal void TClipboardMgr::CanPaste(ResType aClipType)
- {
- if (fClipView)
- if (fClipView->ContainsClipType(aClipType))
- {
- fGotClipType = TRUE;
- fPrefClipType = aClipType;
- }
-
- if (!gApplication->fSysWindowActive)
- Enable(cPaste, fGotClipType);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- pascal void TClipboardMgr::DoMenuCommand(CmdNumber aCmdNumber)
- {
- switch (aCmdNumber)
- {
- case cShowClipboard:
- if (fClipWindow == gApplication->GetActiveWindow())
- fClipWindow->Close(); // Hide the clipboard
- else
- {
- fClipWindow->Open();
- fClipWindow->Select();
- }
- break;
- default:
- inherited::DoMenuCommand(aCmdNumber);
- break;
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAFields
-
- pascal void TClipboardMgr::Fields(TObject* obj) // override
- {
- obj->DoToField("TClipboardMgr", (Ptr)NULL, bClass);
- obj->DoToField("fClipClaimed", (Ptr) & fClipClaimed, bBoolean);
- obj->DoToField("fClipOrphanage", (Ptr) & fClipOrphanage, bObject);
- obj->DoToField("fClipUndoView", (Ptr) & fClipUndoView, bObject);
- obj->DoToField("fClipView", (Ptr) & fClipView, bObject);
- obj->DoToField("fClipWindow", (Ptr) & fClipWindow, bObject);
- obj->DoToField("fClipWrittenToDeskScrap", (Ptr) & fClipWrittenToDeskScrap, bBoolean);
- obj->DoToField("fGotClipType", (Ptr) & fGotClipType, bBoolean);
- //###SRF obj->DoToField("gVarClipPicSize", (Ptr)&gVarClipPicSize, bBoolean);
- obj->DoToField("fPrefClipType", (Ptr) & fPrefClipType, bOSType);
- obj->DoToField("fNewScrapStuff", (Ptr) & fNewScrapStuff, bScrapStuff);
- obj->DoToField("fOldScrapStuff", (Ptr) & fOldScrapStuff, bScrapStuff);
-
- inherited::Fields(obj);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MATerminate
-
- pascal void TClipboardMgr::Close(void)
- {
- LoadScrap(); // ???
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- pascal OSErr TClipboardMgr::PutDeskScrapData(ResType aResType,
- Handle aDataHandle)
- {
- long err;
- SignedByte savedState;
-
- savedState = LockHandleHigh(aDataHandle);
- err = PutScrap(GetHandleSize(aDataHandle), aResType, (*aDataHandle));
- HSetState(aDataHandle, savedState);
- #if qDebugMsg
- if (err != noErr)
- fprintf(stderr,"Error from PutScrap is: %d\n");
- #endif
- return err;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAInit
-
- pascal void InitUClipboardMgr(void)
- {
- TClipboardMgr * aClipboardMgr;
-
- aClipboardMgr = new TClipboardMgr;
- aClipboardMgr->IClipboardMgr();
- }
-
-
-